Programmable logic devices (PLDs) are a well-known type of integrated circuit (IC) that can be programmed to perform specified logic functions. One type of PLD, the field programmable gate array (FPGA), typically includes an array of programmable tiles. These programmable tiles can include, for example, input/output blocks (IOBs), configurable logic blocks (CLBs), dedicated random access memory blocks (BRAM), multipliers, digital signal processing blocks (DSPs), processors, clock managers, delay lock loops (DLLs), and so forth.
Each programmable tile typically includes both programmable interconnect and programmable logic. The programmable interconnect typically includes a large number of interconnect lines of varying lengths interconnected by programmable interconnect points (PIPs). The programmable logic implements the logic of a user design using programmable elements that can include, for example, function generators, registers, arithmetic logic, and so forth.
The programmable interconnect and programmable logic are typically programmed by loading a stream of configuration data into internal configuration memory cells that define how the programmable elements are configured. The configuration data can be read from memory (e.g., from an external PROM) or written into the FPGA by an external device. The collective states of the individual memory cells then determine the function of the FPGA.
Some FPGAs, such as the Virtex FGPA from Xilinx Inc. of San Jose, Calif., can be programmed to incorporate blocks with pre-designed functionalities, i.e., “cores”. A core can include a predetermined set of configuration bits that program the FPGA to perform one or more functions. Alternatively, a core can include source code or schematics that describe the logic and connectivity of a design. Typical cores can provide, but are not limited to, digital signal processing (DSP) functions, memories, storage elements, and math functions. Cores can also be parameterizable, i.e., allowing the user to enter parameters to activate or change certain core functionality.
Traditionally, the user of these cores, and in particular cores that perform arithmetic functions, need to specify the details of how their arithmetic expressions can be implemented on the core. More specifically, some of the details that needed to be explicitly specified by the user are connectivity of inputs using multiplexers; alignment of the input data types to match the arithmetic precision of the core; and pipelining of the data.
Therefore, there is a need for improved techniques for reducing the implementation detail required of a user to execute arithmetic expressions on an IC.